import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class DemoReflex {
            /*
            一、进行反射的练习
             */
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
            //获取类的路劲名称，找到对应的字节码，使用CLass进行加载 类的对象

            //加载我们测试类
            Class clazz=Class.forName("Demo");
            //新的实例newInstance
            Demo demo=(Demo)clazz.newInstance();
            //调用add方法
            int re=demo.add(3,9);
            System.out.println(re);

            //1、获取成员变量,对成员变量进行设置值
            Field filed = clazz.getDeclaredField("name");
            filed.setAccessible(true);  //访问权限，可以访问私有的
            filed.set(demo,"小李");
            System.out.println(demo.getPName());
            System.out.println("————————————————————————————分割线————————————————————————————————");

            //2、获取构造方法
            //Constructor con=clazz.getConstructor();             //(默认是protect,只能获取public的构造方法)
            //System.out.println(con.getName());

            //3、可以获取所有的构造方法,调用构造方法
            Constructor con1=clazz.getDeclaredConstructor(String.class);    //(所有的；此处的执行和2中的不能同时执行)
            con1.newInstance("我是name");  //要写字节码类

            //4、获取公有的方法（只能拿到public）
            Method method=clazz.getMethod("add",int.class,int.class);
                //反射调用方法invoke,如果涉及到private的，需要进行setAccessible设置
            int res = (int)method.invoke(demo, 2, 7);
             System.out.println("add结果集"+res);

            //5、获取全部的方法
            // clazz.getDeclaredMethod()

    }
}
